package com.alipay.util;

import java.net.URL;
import java.util.ArrayList;  
import java.util.HashMap;  
import java.util.Iterator;  
import java.util.List;  
import java.util.Map;  


import java.util.Set;

import org.dom4j.Document;  
import org.dom4j.Element;  
import org.dom4j.Namespace;
import org.dom4j.Node;
import org.dom4j.QName;
import org.dom4j.io.SAXReader;

public class XmlUtils {

	//将一个string格式的xml转成document
	//DocumentHelper.parseText(respXML));  
	
	//获取xml跟节点.getRootElement()
	/*	解析xml节点代码
	Element root = doc.getRootElement();
	Element ec = (Element)root.selectSingleNode("//is_success"); //查找根元素下的第一个 is_success 节点 
	 System.out.println(ec.getTextTrim()); 			 
	
	// 解析request列表下的信息
	List<Node> nodeList = doc.selectNodes("//request/*");
	for (Node node : nodeList) {
		map.put(node.getName(), node.getText());
	}
	// 解析response列表下的订单信息
	List<Node> nodeList1 = doc.selectNodes("//response/trade/*");

	for (Node node : nodeList1) {
		map.put(node.getName(), node.getText());		
	}*/
	
	/**
	 * 将多级map转换成一级map
	 * 如果某一级map的value为list，那么转成类似param=[utf-8, single_trade_query, 2088411298428423, 10000777]的形式
	 * 其他多级map转成统一的一级
	 * @param srcMap
	 * @param returnMap
	 */
	public static void  getMap(Map<String,Object> srcMap,Map<String ,Object> returnMap) {

		for (Iterator iterator = srcMap.entrySet().iterator(); iterator.hasNext();) {
			Map.Entry entry = (Map.Entry) iterator.next();
			/*System.out.println(entry.getKey().getClass().toString()+"____"+entry.getKey().getClass().toString());	
			System.out.println(entry.getValue().getClass().toString()+"-----"+entry.getValue().getClass().toString());
*/					
			// 先遍历一维map
			if (entry.getValue() instanceof Map) {
				getMap( (Map)entry.getValue(),returnMap);
			} else if(entry.getValue() instanceof List){
				returnMap.put(entry.getKey().toString(), entry.getValue());
				
			}
			else{
				returnMap.put(entry.getKey().toString(), entry.getValue().toString());
			}

		}

	}
	
	/**
	 * 将xml转换成Map形式
	 * 	传入xml的根节点，将转换整个xml到map
	 * @param element
	 * @return
	 */
	public static  Object xml2Map(Element element) {  
        System.out.println(element);  
        Map<String, Object> map = new HashMap<String, Object>();  
        List<Element> elements = element.elements();  
        if (elements.size() == 0) {  
            map.put(element.getName(), element.getText());  
            if (!element.isRootElement()) {  
                return element.getText();  
            }  
        } else if (elements.size() == 1) {  
            map.put(elements.get(0).getName(), xml2Map(elements.get(0)));  
        } else if (elements.size() > 1) {  
            // 多个子节点的话就得考虑list的情况了，比如多个子节点有节点名称相同的  
            // 构造一个map用来去重  
            Map<String, Element> tempMap = new HashMap<String, Element>();  
            for (Element ele : elements) {  
                tempMap.put(ele.getName(), ele);  
            }  
            Set<String> keySet = tempMap.keySet();  
            for (String string : keySet) {  
                Namespace namespace = tempMap.get(string).getNamespace();  
                List<Element> elements2 = element.elements(new QName(string, namespace));  
                // 如果同名的数目大于1则表示要构建list  
                if (elements2.size() > 1) {  
                    List<Object> list = new ArrayList<Object>();  
                    for (Element ele : elements2) {  
                        list.add(xml2Map(ele));  
                    }  
                    map.put(string, list);  
                } else {  
                    // 同名的数量不大于1则直接递归去  
                    map.put(string, xml2Map(elements2.get(0)));  
                }  
            }  
        }  
  
        return map;  
    }  
	/**
	 * 将Document转换成map形式返回
	 * @param doc
	 * @return
	 */
	 public static Map<String, Object> Dom2Map(Document doc){  
	        Map<String, Object> map = new HashMap<String, Object>();  
	        if(doc == null)  
	            return map;  
	        Element root = doc.getRootElement();  
	        for (Iterator iterator = root.elementIterator(); iterator.hasNext();) {  
	            Element e = (Element) iterator.next();  
	            //System.out.println(e.getName());  
	            List list = e.elements();  
	            if(list.size() > 0){  
	                map.put(e.getName(), Dom2Map(e));  
	            }else  
	                map.put(e.getName(), e.getText());  
	        }  
	        return map;  
	    }  
	      
	  /**
	   *将xml文档元素转成map
	   * @param e
	   * @return
	   */
	    public static Map Dom2Map(Element e){  
	        Map map = new HashMap();  
	        List list = e.elements();  
	        if(list.size() > 0){  
	            for (int i = 0;i < list.size(); i++) {  
	                Element iter = (Element) list.get(i);  
	                List mapList = new ArrayList();  
	                  
	                if(iter.elements().size() > 0){  
	                    Map m = Dom2Map(iter);  
	                    if(map.get(iter.getName()) != null){  
	                        Object obj = map.get(iter.getName());  
	                        if(!obj.getClass().getName().equals("java.util.ArrayList")){  
	                            mapList = new ArrayList();  
	                            mapList.add(obj);  
	                            mapList.add(m);  
	                        }  
	                        if(obj.getClass().getName().equals("java.util.ArrayList")){  
	                            mapList = (List) obj;  
	                            mapList.add(m);  
	                        }  
	                        map.put(iter.getName(), mapList);  
	                    }else  
	                        map.put(iter.getName(), m);  
	                }  
	                else{  
	                    if(map.get(iter.getName()) != null){  
	                        Object obj = map.get(iter.getName());  
	                        if(!obj.getClass().getName().equals("java.util.ArrayList")){  
	                            mapList = new ArrayList();  
	                            mapList.add(obj);  
	                            mapList.add(iter.getText());  
	                        }  
	                        if(obj.getClass().getName().equals("java.util.ArrayList")){  
	                            mapList = (List) obj;  
	                            mapList.add(iter.getText());  
	                        }  
	                        map.put(iter.getName(), mapList);  
	                    }else  
	                        map.put(iter.getName(), iter.getText());  
	                }  
	            }  
	        }else  
	            map.put(e.getName(), e.getText());  
	        return map;  
	    }  


	    
	    /**
		 *远程解析url
		 *将xml或者一个远程的url请求结果转成map
		 * @param filepath	xml或者一个远程的url请求
		 * @return
		 * @throws Exception
		 */
		public static Map urlOrXml2Map(String filePath) throws Exception {

			SAXReader reader = new SAXReader();
			Document doc = reader.read(new URL(filePath).openStream());
						
			return Dom2Map(doc);

		}
		
}
